package com.kfd.dao;

import com.kfd.bean.Express;
import com.kfd.bean.lanren;
import com.kfd.exception.DuplicateCodeException;
import com.kfd.exception.DuplicateNumberException;

import java.util.List;
import java.util.Map;

public interface ExpressDao {

    /**
     * 返回控制台需要打印的内容（总快递数+新增）（代取件数+新增）
     * @return  返回2条数据0（总快递数+新增）；1（代取件数+新增）
     */
    List<Map<String,Integer>> console();

    /**
     * 查询所有快递
     * @param limit 是否开启分页；true表示开启分页
     * @param offset    sql语句起始下标
     * @param pageNumber    共查询多少条
     * @return  快递的集合
     */
    List<Express> findAll(boolean limit,int offset,int pageNumber);

    /**
     * 根据快递单号查询快递信息
     * @param number    单号
     * @return  查询到的快递信息，有可能为空返回null，单号不存在
     */
    Express findByNumber(String number);

    /**
     * 根据取件码查询快递信息
     * @param code  取件码
     * @return  查询到的快递信息，有可能为空返回null，取件码不存在
     */
    Express findByCode(String code);

    /**
     * 根据用户手机号查询快递信息
     * @param userPhone  用户手机号
     * @param status    表示查询的快递类型 [0、表示查询待取件的快递；1、表示查询已取件的快递；2、表示查询所有]
     * @return  查询到的快递信息，有可能为空返回null，手机号不存在快递
     */
    List<Express> findByUserPhone(String userPhone,int status);

    /**
     * 根据快递员手机号查询快递信息
     * @param sysPhone    快递员手机号
     * @return  查询到的快递信息，有可能为空返回null，手机号不存在快递
     */
    List<Express> findBySysPhone(String sysPhone);

    /**
     * 快递的录入
     * @param express   快递信息
     * @return  返回是否录入成功
     */
    boolean insert(Express express) throws DuplicateCodeException, DuplicateNumberException;

    /**
     * 快递的修改
     * @param express   快递信息，id不变修改其他值（number,company,username,userphone）
     * @return  返回是否修改成功
     */
    boolean update(Express express);

    public List<Express> findBySysPhoneNo(String sysPhone,String status);
    /**
     * 快递取件；更改快递的状态为1，表示已取件
     * @param code   快递取件码
     * @return  返回是否修改成功
     */
    boolean updateStatus(String code);

    /**
     * 快递的删除
     * @param id   快递的id
     * @return  返回是否删除成功
     */
    boolean delete(int id);

    /**
     * 快递单号是否重复验证
     * @param number    快递单号
     * @return  true是不重复，false重复需要重新输入
     */
    boolean numberRepetition(String number);

    /**
     * 取件码重复验证，
     * @param code  随机生成的取件码
     * @return  true是不重复，false重复需要重新生成
     */
    boolean codeRepetition(String code);

    /**
     * 查询总的懒人排行
     * @return
     */
    List<lanren> getLanlist(String year, String month);

}
